package com.amarsoft.apot.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * java.util.Date是可变类型,SimpleDateFormat非线程安全等问题.
 * 故此,Java8引入了一套全新的日期时间处理API,新的API基于ISO标准日历系统.
 * Java8时间日期类操作
 */
public class DateUtils {

    /**
     * 日期时间转字符串
     * @return
     */
    public static String parseDateToString() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        String nowText = now.format(formatter);
        return nowText;
    }

    /**
     * 字符串转日期时间
     * @return
     */
    public static LocalDateTime parseStringToDate() {
        String datetimeText = "1999-12-31 23:59:59";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime datetime = LocalDateTime.parse(datetimeText, formatter);
        return datetime;
    }

    public static void main(String[] args) {
        //获取日期
        LocalDate date = LocalDate.now();
        System.out.println(date); // 2021-01-30
        System.out.printf("\n年=%d,月=%d,日=%d", date.getYear(), date.getMonthValue(), date.getDayOfMonth());

        // 指定构造日期
        LocalDate date1 = LocalDate.of(2000, 1, 1);
        System.out.println("\n千禧年=" + date1);//千禧年=2000-01-01
        System.out.println("\n日期是否相等:"+date1.equals(date));

        // 时间增量
        LocalTime time = LocalTime.now();
        LocalTime newTime = time.plusHours(2);//增加2个小时
        System.out.println("\nnewTime=" + newTime); //newTime=12:34:38.584

        // 日期增量
        LocalDate date2 = LocalDate.now();
        LocalDate newDate = date2.plus(1, ChronoUnit.WEEKS);//增加一周7天
        System.out.println("\nnewDate=" + newDate);// newDate=2021-02-06

        //Java 8不仅分离了日期和时间，也把时区分离出来了。
        // 现在有一系列单独的类如ZoneId来处理特定时区，ZoneDateTime类来表示某时区下的时间。
        ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");// 上海时间
        ZonedDateTime shanghaiZonedDateTime = ZonedDateTime.now(shanghaiZoneId);
        ZoneId tokyoZoneId = ZoneId.of("Asia/Tokyo");// 东京时间
        ZonedDateTime tokyoZonedDateTime = ZonedDateTime.now(tokyoZoneId);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("\n上海时间: " + shanghaiZonedDateTime.format(formatter));
        System.out.println("\n东京时间: " + tokyoZonedDateTime.format(formatter));

        // 解析日期
        String dateText = "20180924";
        LocalDate date3 = LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println("\n格式化之后的日期=" + date3);// 格式化之后的日期=2018-09-24

        // 格式化日期
        dateText = date3.format(DateTimeFormatter.ISO_DATE);
        System.out.println("\ndateText=" + dateText);//dateText=2018-09-24

        //日期时间比较->isAfter()、isBefore()用于判断当前日期时间和指定日期时间的比较
        LocalDate now = LocalDate.now();
        LocalDate date4 = LocalDate.of(2000, 1, 1);
        if (now.isAfter(date4)) {
            System.out.println("\n千禧年已经过去了");
        }
        LocalDate date5 = LocalDate.of(2020, 1, 1);
        if (now.isBefore(date5)) {
            System.out.println("\n2020年还未到来");
        }
    }

}
